home *** CD-ROM | disk | FTP | other *** search
/ Amiga Format CD 24 / Amiga Format AFCD24 (Feb 1998, Issue 108).iso / -seriously_amiga- / shareware / programming / other / kaliosisquantrum / morb / oo.i < prev    next >
Text File  |  1998-01-12  |  9KB  |  280 lines

  1. *
  2. * CdBSian Obviously Universal & Interactive Nonsense (COUIN)
  3. * (Absurdité CdBSienne Manifestement Universelle et Interactive)
  4. * ©1997-1998, CdBS Software (MORB)
  5. * Object oriented support include file
  6. * $Id: OO.i 0.9 1998/01/03 17:36:01 MORB Exp MORB $
  7. *
  8.  
  9. ***** Class structure *****
  10.          rsreset
  11. Class              rs.b      0
  12. ci_ClassObj        rs.l      1         ; Initialized by InitClass()
  13. ci_SuperClass      rs.l      1         ; Address of superclass
  14. ci_InstanceSize    rs.l      1         ; Size of an instance (set by
  15.                                        ; InitClass)
  16. ci_BaseOffset      rs.l      1         ; Offset of the base address from
  17.                                        ; the beginning of the instance
  18.                                        ; (Init-ed by InitClass)
  19. ci_JumpTable_Size  rs.l      1         ; Length of the jumptable (idem)
  20. ci_Data_Size       rs.l      1         ; Length of all the data blocks
  21. ci_Generation      rs.l      1         ; Generation number of the class
  22.                                        ; (ie. number of classes successively
  23.                                        ; herited by this one)
  24. ci_DataLength      rs.l      1         ; Length of instance data
  25. ci_FuncTable       rs.l      1         ; Pointer to the functions table
  26. ci_Datas           rs.l      1         ; Pointer to defaults data values
  27. ci_ClassData       rs.l      1         ; A pointer that is passed to the
  28.                                        ; functions for their own use
  29. ci_InitCode        rs.l      1         ; Optional init routine
  30. ci_SizeOf          rs.b      0
  31.  
  32. ***** Objects *********************************************************
  33. *
  34. * The objects are stored in memory as follows :
  35. * They are referenced by a base address. The base address points to a
  36. * node structure used to link many objects together, followed by the
  37. * class address and the data table.
  38. * The data table contains the address of the data block of each herited
  39. * class. The data blocks are stored immediately after the data table.
  40. * Before the base address lies the function table. It is similar to the
  41. * data table, except that it is stored in reverse order, in order to be
  42. * accessed with negative offsets. It is preceded by the jump table.
  43. *
  44. * Each data field in an object is referenced by a longword. It is
  45. * splitted in two words : the lower word contains the offset in the
  46. * data table to the adress of the block where the data lies, while
  47. * the upper word is the offset of the data into the data block.
  48. *
  49. * Methods are referenced same way as datas : the lower word is a
  50. * negative offset to the beginning of the jumptable where the method
  51. * lies, while the upper word is the negative offset of this method
  52. * in the jumptable.
  53. *
  54. ***********************************************************************
  55.  
  56.  
  57. ***** Macros **********************************************************
  58.  
  59. **** Class definition macros ****
  60. CLASS    macro     ; Name,SuperClassName
  61. \1_ID              EQU       \2_ID+4
  62. CLASS_ID           SET       \1_ID
  63. METHOD_OFST        SET       0
  64. DATA_OFST          SET       0
  65.          endm
  66.  
  67. METHOD   macro     ; Name
  68. \1                 EQU       METHOD_OFST<<16|(-CLASS_ID & $ffff)
  69. METHOD_OFST        SET       METHOD_OFST-6
  70.          endm
  71.  
  72. DATA_BYTE macro    ; Prefix,Name,Num
  73. \1_\2              EQU       DATA_OFST
  74. \2                 EQU       DATA_OFST<<16|CLASS_ID
  75. DATA_OFST          SET       DATA_OFST+\3
  76.          endm
  77.  
  78. DATA_WORD macro    ; Prefix,Name,Num
  79. \1_\2              EQU       DATA_OFST
  80. \2                 EQU       DATA_OFST<<16|CLASS_ID
  81. DATA_OFST          SET       DATA_OFST+2*\3
  82.          endm
  83.  
  84. DATA_LONG macro    ; Prefix,Name,Num
  85. \1_\2              EQU       DATA_OFST
  86. \2                 EQU       DATA_OFST<<16|CLASS_ID
  87. DATA_OFST          SET       DATA_OFST+4*\3
  88.          endm
  89.  
  90. DATA_SIZE macro    ; Name
  91. \1                 EQU       DATA_OFST
  92.          endm
  93.  
  94. **** Method invoking macros ****
  95. DOMTD    macro     ; Method ID (Dn),Object (An)  Note : trashes a0 & a1
  96.          IFNC      "\2","a0"
  97.          move.l    \2,a0
  98.          ENDC
  99.  
  100.          move.l    -4(a0,\1.w),a1
  101.          swap      \1
  102.          jsr       (a1,\1.w)
  103.          endm
  104.  
  105. DOMTDJ   macro
  106.          IFNC      "\2","a0"
  107.          move.l    \2,a0
  108.          ENDC
  109.  
  110.          move.l    -4(a0,\1.w),a1
  111.          swap      \1
  112.          jmp       (a1,\1.w)
  113.          endm
  114.  
  115. DOMTDI   macro     ; #Method ID,Object (An)  Note : trashes a0 & a1
  116.          IFNC      "\2","a0"
  117.          move.l    \2,a0
  118.          ENDC
  119.  
  120.          move.l    -4+(\1<<16>>16)(a0),a1
  121.          jsr       (\1>>16)(a1)
  122.          endm
  123.  
  124. DOMTDJI  macro     ; #Method ID,Object (An)  Note : trashes a0 & a1
  125.          IFNC      "\2","a0"
  126.          move.l    \2,a0
  127.          ENDC
  128.  
  129.          move.l    -4+(\1<<16>>16)(a0),a1
  130.          jmp       (\1>>16)(a1)
  131.          endm
  132.  
  133.  
  134. **** Data access macros ****
  135. LBLOCKEA macro     ; Data or class ID (Dn),Object (An),Dest (Rn)
  136.          move.l    12(\2,\1.w),\3
  137.          endm
  138.  
  139. LBLOCKEAI macro    ; #Data or class ID,Object (An),Dest (Rn)
  140.          move.l    12+(\1<<16>>16)(\2),\3
  141.          endm
  142.  
  143. LDATAEA  macro     ; Data ID (Dn),Object (An),Dest (An)
  144.                    ; Note : swaps Dn
  145.          move.l    12(\2,\1.w),\3
  146.          swap      \1
  147.          add.w     \1,\3
  148.          endm
  149.  
  150. LDATAEAI macro     ; #Data ID,Object (An),Dest (An)
  151.          move.l    12+(\1<<16>>16)(\2),\3
  152.          add.l     #\1>>16,\3
  153.          endm
  154.  
  155. LDATAB   macro     ; Data ID (Dn),Object (An),Dest (Rn)
  156.                    ; Note : swaps Dn & trashes a0
  157.          move.l    12(\2,\1.w),a0
  158.          swap      \1
  159.          move.b    (a0,\1.w),\3
  160.          endm
  161.  
  162. LDATABI  macro     ; #Data ID,Object (An),Dest (Rn)
  163.                    ; Note : trashes a0
  164.          move.l    12+(\1<<16>>16)(\2),a0
  165.          move.b    (\1>>16)(a0),\3
  166.          endm
  167.  
  168. LDATAW   macro     ; Data ID (Dn),Object (An),Dest (Rn)
  169.                    ; Note : swaps Dn & trashes a0
  170.          move.l    12(\2,\1.w),a0
  171.          swap      \1
  172.          move.w    (a0,\1.w),\3
  173.          endm
  174.  
  175. LDATAWI  macro     ; #Data ID,Object (An),Dest (Rn)
  176.                    ; Note : trashes a0
  177.          move.l    12+(\1<<16>>16)(\2),a0
  178.          move.w    (\1>>16)(a0),\3
  179.          endm
  180.  
  181. LDATAL   macro     ; Data ID (Dn),Object (An),Dest (Rn)
  182.                    ; Note : swaps Dn & trashes a0
  183.          move.l    12(\2,\1.w),a0
  184.          swap      \1
  185.          move.l    (a0,\1.w),\3
  186.          endm
  187.  
  188. LDATALI  macro     ; #Data ID,Object (An),Dest (Rn)
  189.                    ; Note : trashes a0
  190.          move.l    12+(\1<<16>>16)(\2),a0
  191.          move.l    (\1>>16)(a0),\3
  192.          endm
  193.  
  194.  
  195. SDATAB   macro     ; Source,Data ID (Dn),Object (An)
  196.                    ; Note : swaps Dn & trashes a0
  197.          move.l    12(\3,\2.w),a0
  198.          swap      \2
  199.          move.b    \1,(a0,\2.w)
  200.          endm
  201.  
  202. SDATABI  macro     ; Source,Data ID (Dn),Object (An)
  203.                    ; Note : trashes a0
  204.          move.l    12+(\2<<16>>16)(\3),a0
  205.          move.b    \1,(\2>>16)(a0)
  206.          endm
  207.  
  208. SDATAW   macro     ; Source,Data ID (Dn),Object (An)
  209.                    ; Note : swaps Dn & trashes a0
  210.          move.l    12(\3,\2.w),a0
  211.          swap      \2
  212.          move.w    \1,(a0,\2.w)
  213.          endm
  214.  
  215. SDATAWI  macro     ; Source,Data ID (Dn),Object (An)
  216.                    ; Note : trashes a0
  217.          move.l    12+(\2<<16>>16)(\3),a0
  218.          move.w    \1,(\2>>16)(a0)
  219.          endm
  220.  
  221. SDATAL   macro     ; Source,Data ID (Dn),Object (An)
  222.                    ; Note : swaps Dn & trashes a0
  223.          move.l    12(\3,\2.w),a0
  224.          swap      \2
  225.          move.l    \1,(a0,\2.w)
  226.          endm
  227.  
  228. SDATALI  macro     ; Source,Data ID (Dn),Object (An)
  229.                    ; Note : trashes a0
  230.          move.l    12+(\2<<16>>16)(\3),a0
  231.          move.l    \1,(\2>>16)(a0)
  232.          endm
  233.  
  234.  
  235. ***** Defs for RootClass **********************************************
  236. DummyClass_ID       = -4     ; Just to fake the CLASS macro
  237.  
  238.          CLASS     RootClass,DummyClass
  239.          METHOD    MTD_New
  240.          METHOD    MTD_Dispose
  241.          METHOD    MTD_AddMember
  242.          METHOD    MTD_Add
  243.          METHOD    MTD_Remove
  244.          DATA_BYTE root,DTA_List,MLH_SIZE
  245.          DATA_LONG root,DTA_Parent,1
  246.          ;DATA_BYTE root,RCSize,0
  247.  
  248. ***** Objects trees ***************************************************
  249. *
  250. * Objects tree are data tables that describe a complete tree of objects
  251. * and subobjects. It is useful for example to define a gui with groups,
  252. * subgroups, and buttons.
  253. *
  254. * The table is constituted of one root object entry, which may contain
  255. * entries for subobjects, and so on.
  256. *
  257. * An object entry looks like that :
  258. * L OBJ_Begin
  259. * L Class
  260. * L DataID
  261. * L Data
  262. * L DataID
  263. * L Data
  264. * .
  265. * .
  266. * .
  267. * L OBJ_End
  268. *
  269. * Just before OBJ_END it is possible to insert 1 or more objects
  270. * entries to define sub objects
  271. *
  272. * Instead of OBJ_End, it is possible to use OBJ_Store followed by the
  273. * address of the pointer to store the address of the preceding object
  274. *
  275. ***********************************************************************
  276.  
  277. OBJ_Begin          = 0
  278. OBJ_End            = -1
  279. OBJ_Store          = -2
  280.